package Model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;

@Entity
@Table(name = "associado")
@SuppressWarnings("serial")
public class Associado implements Serializable {

   @Id
   @SequenceGenerator(name = "cod_associado", sequenceName = "cod_associado_seq", allocationSize = 1)
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_associado")
   @Column(name = "cod_associado", nullable = false)
   private int codAssociado;
   @Column(name = "num_associado")
   private int numAssociado;

   @ManyToOne(fetch = FetchType.EAGER)
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   @JoinColumn(name = "cod_associacao", insertable = true, updatable = true)
   private Associacao associacao;

   @ManyToOne(fetch = FetchType.EAGER, cascade = {javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.PERSIST})
   @JoinColumn(name = "cod_endereco")
   @Fetch(FetchMode.SELECT)
   private Endereco endereco;
   @Column(name = "nome")
   private String nome;
   @Column(name = "sitio")
   private String sitio;

   @ManyToOne(fetch = FetchType.EAGER)
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   @JoinColumn(name = "cod_banco", insertable = true, updatable = true)
   private Banco banco;
   @Column(name = "agencia")
   private String agencia;
   @Column(name = "conta")
   private String conta;
   @Column(name = "tipo_conta")
   private String tipoConta;
   @Temporal(TemporalType.DATE)
   @Column(name = "data_nasc")
   private Date dataNasc;
   @Column(name = "cpf")
   private String cpf;
   @Column(name = "sexo")
   private String sexo;
   @Column(name = "email")
   private String email;
   @Column(name = "telefone_residencial")
   private String telefoneResidencial;
   @Column(name = "telefone_celular")
   private String telefoneCelular;
   @Column(name = "telefone_comercial")
   private String telefoneComercial;
   @Column(name = "ativo")
   private boolean ativo;

   @OneToMany(mappedBy = "associado", fetch = FetchType.EAGER, cascade = {javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.PERSIST})
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   private Collection<Usuario> Usuario;

   @OneToMany(mappedBy = "associado", fetch = FetchType.EAGER)
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   private Collection<ContaReceberAssociado> contaReceberAssociado;

   @OneToMany(mappedBy = "associado", fetch = FetchType.EAGER)
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   private Collection<Previsao> previsao;

   //Construtores
   //Construtor padrao
   public Associado() {

      this.nome = "";
      this.sitio = "";
      this.agencia = "";
      this.conta = "";
      this.tipoConta = "";
      this.dataNasc = new Date();
      this.cpf = "";
      this.sexo = "";
      this.email = "";
      this.telefoneResidencial = "";
      this.telefoneCelular = "";
      this.telefoneComercial = "";
      this.ativo = false;
      contaReceberAssociado = new ArrayList<ContaReceberAssociado>();
   }
   //Construtor com parametros

   public Associado(Integer codigo){
       codAssociado = codigo;
   }
   public Associado(int numAssociado, Associacao associacao, Endereco endereco, String nome, String sitio, Banco banco, String agencia, String conta, String tipoConta, Date dataNasc, String cpf, String sexo, String email, String telefoneResidencial, String telefoneCelular, String telefoneComercial, boolean ativo) {
      this.codAssociado = this.getCodAssociado();
      this.numAssociado = numAssociado;
      this.associacao = associacao;
      this.endereco = endereco;
      this.nome = nome;
      this.sitio = sitio;
      this.banco = banco;
      this.agencia = agencia;
      this.conta = conta;
      this.tipoConta = tipoConta;
      this.dataNasc = dataNasc;
      this.cpf = cpf;
      this.sexo = sexo;
      this.email = email;
      this.telefoneResidencial = telefoneResidencial;
      this.telefoneCelular = telefoneCelular;
      this.telefoneComercial = telefoneComercial;
      this.ativo = ativo;
   }

   //Metodos get e set
   public int getCodAssociado() {
      return codAssociado;
   }

   public void setCodAssociado(int codAssociado) {
      this.codAssociado = codAssociado;
   }

   public int getNumAssociado() {
      return numAssociado;
   }

   public void setNumAssociado(int numAssociado) {
      this.numAssociado = numAssociado;
   }

   public Associacao getAssociacao() {
      return associacao;
   }

   public void setAssociacao(Associacao associacao) {
      this.associacao = associacao;
   }

   public Endereco getEndereco() {
      return endereco;
   }

   public void setEndereco(Endereco endereco) {
      this.endereco = endereco;
   }

   public String getNome() {
      return nome;
   }

   public void setNome(String nome) {
      this.nome = nome;
   }

   public String getSitio() {
      return sitio;
   }

   public void setSitio(String sitio) {
      this.sitio = sitio;
   }

   public Banco getBanco() {
      return banco;
   }

   public void setBanco(Banco banco) {
      this.banco = banco;
   }

   public String getAgencia() {
      return agencia;
   }

   public void setAgencia(String agencia) {
      this.agencia = agencia;
   }

   public String getConta() {
      return conta;
   }

   public void setConta(String conta) {
      this.conta = conta;
   }

   public Date getDataNasc() {
      return dataNasc;
   }

   public void setDataNasc(Date dataNasc) {
      this.dataNasc = dataNasc;
   }

   public String getCpf() {
      return cpf;
   }

   public void setCpf(String cpf) {
      this.cpf = cpf;
   }

   public String getSexo() {
      return sexo;
   }

   public void setSexo(String sexo) {
      this.sexo = sexo;
   }

   public String getEmail() {
      return email;
   }

   public void setEmail(String email) {
      this.email = email;
   }

   public String getTelefoneResidencial() {
      return telefoneResidencial;
   }

   public void setTelefoneResidencial(String telefoneResidencial) {
      this.telefoneResidencial = telefoneResidencial;
   }

   public String getTelefoneCelular() {
      return telefoneCelular;
   }

   public void setTelefoneCelular(String telefoneCelular) {
      this.telefoneCelular = telefoneCelular;
   }

   public String getTelefoneComercial() {
      return telefoneComercial;
   }

   public void setTelefoneComercial(String telefoneComercial) {
      this.telefoneComercial = telefoneComercial;
   }

   public boolean getAtivo() {
      return ativo;
   }

   public void setAtivo(boolean ativo) {
      this.ativo = ativo;
   }

   public Collection<Usuario> getUsuario() {
      return Usuario;
   }

   public void setUsuario(Collection<Usuario> Usuario) {
      this.Usuario = Usuario;
   }

   public String getTipoConta() {
      return tipoConta;
   }

   public void setTipoConta(String tipoConta) {
      this.tipoConta = tipoConta;
   }

    public Collection<ContaReceberAssociado> getContaReceberAssociado() {
        return contaReceberAssociado;
    }
    public void setContaReceberAssociado(Collection<ContaReceberAssociado> contaReceberAssociado) {
        this.contaReceberAssociado = contaReceberAssociado;
    }
}
